﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Qas.CommonLogic.BusinessObjects
{
    /// <summary>
    /// План - это результат работы системы; численный вектор, 
    /// длина которого соответствует количеству существующих 
    /// задач. Значение i-ого элемента показывает, какой 
    /// порядковый номер соответствует i-й (по id) задаче
    /// </summary>
    public class Plan
    {

        List<Task> tasks = new List<Task>();

        /// <summary>
        /// Пустой план характеризуется только своей размерностью - 
        /// максимальным количеством задач, которое он может "вместить"
        /// </summary>
        /// <param name="dimension">Размерность плана</param>
        public Plan()
        {
            this.tasks = new List<Task>();
        }

        public void AddPlanTail(Plan plan)
        {
            this.tasks.AddRange(plan.Tasks);
        }

        public double Cost
        {
            get
            {
                double result = 0;

                foreach (Task task in this.tasks)
                {
                    result += task.PDCost.Expectancy;
                }

                return result;
            }
        }

        private List<int> taskSequence = new List<int>();

        /// <summary>
        /// Сопоставляет данному численному вектору последовательность 
        /// задач (а точнее, их идентификаторов)
        /// </summary>
        /// <returns>Список - последовательность идентификационных 
        /// номеров задач, упорядоченных по порядку выполнения</returns>
        private List<int> ToSequence()
        {
            return null;
        }

        /// <summary>
        /// Проверка плана: может ли данная последовательность задач достичь постусловий
        /// </summary>
        public bool Check(List<Condition> preCond, List<Condition> postCond)
        {
            return false;
        }

        /// <summary>
        /// Суммарное время совокупности задач 
        /// (аддитивное свойство)
        /// </summary>
        
        public double ExpectancyTime
        {
            get
            {
                double result = 0;

                foreach (Task task in this.tasks)
                {
                    result += task.PDTime.Expectancy;
                }

                return result;
            }
        }

        public List<Task> Tasks
        {
            get
            {
                return this.tasks;
            }
        }

        //добавление задачи в план (с учетом стоимости)
        public void AddTask(Task task)
        {
            this.tasks.Add(task);         
        }

        // учитываем только задачи
        public Plan(List<Task> tasks)
        {
            if (tasks == null)
            {
                throw new NullReferenceException("Список задач - null");
            }
            this.tasks = new List<Task>(tasks);            
        }

        public string Title
        {
            get
            {
                string tasksList = string.Empty;
                foreach (Task task in this.tasks)
                {
                    tasksList += "--" + task.ID;
                }
                
                string title = string.Format("{0}", tasksList);
                
                return title;
            }
        }
    }
}
